#pragma once

#include <irrlicht.h>

#include "Cenario.h"
#include "Menus.h"
#include "Renderizador.h"
#include "GerenciaEntradas.h"
typedef GerenciaEntradas Entradas;
#include "GerenciaAudio.h"
#include "GerenciaFisica.h"
typedef GerenciaFisica Fisica;

using namespace irr;

class IrrPhysx
{
public:
	IrrPhysx(core::dimension2d<u32> WindosSize, Fisica *irrFisica = NULL);
	~IrrPhysx(void);

	//Renderiza o frame final na tela
	void DrawFrame(int CenaAtual = -1);
	//Se a IrrPhysx esta ativa, comeca a Renderizar
	bool EndIrrPhysx();

	//adiciona um novo cenario, a cena atual passa a ser a adicionada
	void NewCenario();
	//adiciona um novo menu, a cena atual passa a ser a adicionada
	void NewMenu();

	//retorna a cena atual
	Cena *GetCenaAtual() const;
	//retorna o id da Cena Atual
	int GetIDCenaAtual() const;
	//retorna o total de cenas existents
	int GetNumCenas() const;
	//muda a cena atual
	void SetCenaAtual(int newCenaAtual);
	//retorna fisica
	Fisica *GetFisica() const;
	//se foi pressionado alguma tecla
	bool TeclaPressionada(int keyCode);
	void LimpaTeclas();
	//retorna o render
	Renderizador GetRender() const;
	//Trata sons so motor
	void RegistraSom(int id, char *nomeArq);
	void PlaySom(int id, bool loop = false);
	void StopSom(int id);
	//valor de volume entre 0 e 1
	void SetVolume(int id, float volume);

	//desenha as bounding dos objetos que existem na cena
	void DrawBoundingBox(bool flag);

	//COLISOES
	//desativa a colisao entre dois GameObjects
	void desativaColisao(int IdObj1, int IdObj2);
	//registra colisoes
	void registraColisao(int idColisao, int IdObj1, int IdObj2);
	void registraColisao(int idColisao, NxActor *obj1, NxActor *obj2);

	//GUI
	//adiciona/registra um botao
	void AddBotao(int xi, int xf, int yi, int yf, int id, const wchar_t *texto);
	//se um botao foi clicado
	bool BotaoClicado(int id);

	//delete uma cena, incluindo seus gameobjects, colisoes etc
	void DeleteCenario(int idCena);

	//encerra o motor
	void CloseIrrPhysx();

	//muda o nome da janela
	void SetNameWindow(const wchar_t *nome);

	//se qualquer tecla foi pressionada
	bool AnyKeyDown();

private:
	//controla a Irrlicht
	IrrlichtDevice *device;

	//controla a Physx
	Fisica *irrFisica;
	
	//controla o audio
	GerenciaAudio Audio;

	//controla o teclado
	Entradas Input;

	//controla o rendering
	Renderizador render;

	//vector de cenas, podem ser menus, ou o jogo
	std::vector<Cena*> cenas;
	int cenaAtual, numCenas;

	//se o motor renderizara os bondinx box;
	bool boundingBox;
};

